/* 类和对象 */
void main() {
  Person p = new Person();
  p.name = 'cloud9';
  p.age = 20;

  /* get + set 调用时不需要按方法编写, 视为属性调用 */
  p.setAge = 20;
  print(p.getAge);

  p.getInfo();

  /* 访问静态属性和方法 */
  Person.getStaticName();
  Person.staticName;

  /* 对象实例不支持静态成员访问 */

  Point point = Point(3, 4);
  // Point point2 = Point.create(3, 4);
}

/* 样例Class */
class Person {
  late String name;
  late int age;

  /* 访问修饰符 _下划线前缀表示该属性私有 */
  late Person _wife;

  /* 静态成员 */
  static String staticName = "cloud9";

  static String getStaticName() {
    return staticName;
  }

  void getInfo() {
    print("person -> age: $age, name: $name");
  }

  void checkWife() {
    print("wife -> $_wife");
  }

  /* get & set 方法简化 */
  set setAge(val) { /* set 默认无返回类型，直接不编写返回类型 */
    this.age = val;
  }
  num get getAge { /* get默认无参数方法，直接不编写括号 */
    return this.age;
  }
}

/* 构造器用法 */
class Point {
  late int x, y;

  // Point() {
  //   print("触发默认构造器");
  // }

  // Point(int x, int y) {
  //   print("触发参数构造器1");
  //   this.x = x;
  //   this.y = y;
  // }

  // Point.create(int x, int y) {
  //   print("触发参数构造器2");
  //   this.x = x;
  //   this.y = y;
  // }
  Point(this.x, this.y);

  /* 初始化的默认赋值列表 */
  Point.defaultInit() : x = 3, y = 44 {
    print("x -> $x, y -> $y");
  }
}
